[COM201] Generative AIとAWSを使って60分でゲームを開発する
re:Invent2023 現地参加組の me です。Building a cloud-backed generative AI game in 60 minutes というセッションに参加してきたので内容をまとめます。
セッション動画へのリンクは後日動画が公開され次第追加します。
セッション概要
- セッション ID: COM201
- タイトル:Building a cloud-backed generative AI game in 60 minutes
- スピーカー:Ben Ellerby/Aleios
- レベル:200 - Intermediate
セッション概要:
Generative AI は開発者、企業、クリエイターの想像力をかきたてる。ChatGPT は氷山の一角に過ぎない。Generative AI は、想像力を刺激する斬新でクリエイティブなユーザー体験を可能にします。このセッションでは、Amazon Bedrock、Amazon API Gateway、AWS AppSync を使って、Generative AI を搭載したゲームを構築するデモをご覧ください。このゲームでは、Amazon Titan によって生成・採点されたプロットの絵文字から、プレイヤーが映画や本のタイトルを当てるというものです。
絵文字で表現された映画の題名を当てるゲーム:Emojios
Generative AI をバックエンドに利用したゲーム、Emojios は実在する映画を表現した絵文字を6つ出題します。プレイヤーは6つの絵文字から連想される映画を回答します。
Emojios では問題の生成、答えの共有とスコアリングのクイズロジック部分にLLM(大規模言語モデル)を利用しています。イノベーティブかつ楽しめるコンテンツを世界に発信することを目的としたサービスとなっています。
実装手順
Emojios の実装手順は以下の通りです。モデルの選定、モデルのホスティング、プロンプトの調整、アプリとの疎通の順に実装を行います。ひとつづつ順を追って解説します。
モデルの選定
クイズの肝となる Emoji ロジックに利用する機械学習モデルの選定を行います。Emojiosの問題生成部分にはLLM(大規模言語モデル)を利用します。
LLM (Large Language Model)
LLMとは大量のテキストデータを使ってトレーニングされた自然言語処理のモデルです。LLMをチューニングすることでテキストの分類や感情分析、情報の抽出、文章の要約など幅広い自然言語処理に適用できます。
モデルを選定する際はタスクの性質、ファインチューニング、解決したいタスクの複雑度など、以下の6つの基準について考える必要があります。
Bedrock について
モデルの選定が完了したら次にモデルをどこでホスティングするか考える必要があります。
EmojiosのLLMモデルはBedrockでホスティングするようにしました。Bedrockは大規模言語モデル(LLM)を含むGenerative AIモデルをAPIを通じて利用できるようにすることができるAWSのフルマネージドサービスです。AWS Titanなどの他のAWSサービスと連携してファインチューニングを行ったり、完全にセキュアでプライベートな環境でモデルのカスタマイズを行うことができます。
プロンプトエンジニアリング
次にクイズロジックをAIに解決してもらうためのプロンプトを考えます。プロンプトエンジニアリングについて考えていきましょう。
Zero-Shot Prompt
Zero-Shot プロンプトとは、事前に情報を与えずにモデルに直接質問をするプロンプトのことです。
膨大なテキストデータで学習済みのモデルなのでそこそこの回答が返ってくるのですが、本当に欲しい回答が得られることは稀なのでより工夫したプロンプトを渡してあげる必要があります。
Single-Shot Prompt
プロンプトに欲しい回答の例を含めることでより理想に近い回答を得ることができます。解決したい問題に必要な例がひとつしかないケースにはこのアプローチが有効です。
Few-Shots Prompts
Few-Shots Promptには複数のタスク固有の例をプロンプトに含めます。
期待される応答の構造や文脈のサンプルを提供し、より多くのタスク固有の情報を与えることでモデルがタスクに対してより良く汎化できるようにすることを目的としています。複数の例から推論を行うことでより複雑なタスクの実行を実現します。
Emojiosでやりたいこと
我々のアプリに戻りましょう。実在する作品を6つの絵文字で表現する、という課題を解決するプロンプトを考える必要があります。
Zero-Shot Promptでの回答はこのようになりました。回答に含まれる絵文字が多すぎる上にハリー・ポッターを連想できるような絵文字が少ないように感じます。この絵文字から連想できる映画はなんですか?と聞かれてハリー・ポッターと回答できる人は少ないでしょう。
改良後のプロンプト
先ほどのプロンプトに幾つかの前提条件と回答の例を加えました。また、プロンプト自体にも6文字でありタイトルと内容の両方を表現していること、などのさらに細かい要件を追加しました。
その結果がこちらです(ロードオブザリングの例)
様々な作品をInputに加えた結果以下のようなレスポンスが返るようになりました。
ランダム要素の追加
毎回同じ内容にならないようにパラメータ推論の調整を行います。
モデルのファインチューニングをAmazon Titanと連携して行います。
アプリ全体のアーキテクチャ
最後にアプリとして機能するためにフロント部分からの呼び出しを設定します。全体のアーキテクチャはこのようになります。
フロントエンドからAPI Gatewayを通じてLambdaをを呼び出し、その後ろにBedrockでホスティングされたモデルがいる構成になります。DynamoDBにキャッシュを保持し、不要なBedrockへのアクセスを防ぎます。月に一度起動するようにバッチを設定し、モデルの更新を行います。
こちらがSDKから呼び出す際のBedrockへのInputの例です。
LangChain
Bedrockを呼び出す際にLangChainを介してリクエストを行います。
LangChainを挟むことでよりシンプルで一貫性のあるリクエストをモデルに渡すことができます。
LangChainを介してSDKからのリクエストを送信する例が以下です。
スコアの判定ロジック
Emojiosは正解不正解ではなくパーセンテージでスコアを出力します。例えば、ハリー・ポッターと賢者の石、が正確な答えであるクイズにハリー・ポッターと秘密の部屋、と回答した場合の正解率は92%と出力されます。
Q&A
セッション最後の Q&A タイムで Bedrock で機械学習モデルをホスティングしていると思うが機械学習周りで他にも発生しうるコストはありますか?という質問が投げられており、月に一度モデルを更新する際に学習にかかるコストが発生するとの回答がありました(このようないい質問がすぐに思いつける余裕が欲しいものです・・・)。
所感
非常にスピード感のある発表と時間の半分を QA に充てるという斬新な発表でした。ここで物怖じせずどんどん質問が出てくるところにアメリカらしさを感じました。セッション内容も今が旬真っ只中のBedrockを使った実装例を細かく説明してくれたので理解しやすく大満足でした。キャプチャを取りながらのセッション参加だったため聞き逃している箇所もあると思いますので、セッション動画が公開され次第追記更新をしていこうと思います。